/**
 * Minio文件上传MCP工具
 * 提供文件上传到Minio对象存储并生成下载链接的功能
 */

import type { ToolPackage } from '../../core/tool-registry.js';
import { createTool, field } from '../../core/tool-schema.js';
import { MinioUploadTool } from './tool.js';

const minioUploadTool = new MinioUploadTool();

/**
 * 上传文件到Minio存储
 */
const uploadToMinio = createTool()
  .name('upload_file_to_minio')
  .title('上传文件到Minio')
  .description('将本地文件上传到Minio对象存储并生成带过期时间的下载链接')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文件管理')
  .tags(['minio', 'upload', 'storage', 'file'])
  .parameter(
    'filePath',
    field.required(
      field.string({
        description: '要上传的本地文件完整路径',
      })
    )
  )
  .parameter(
    'objectName',
    field.optional(
      field.string({
        description: '对象存储中的文件名（可选，默认使用原文件名）',
      })
    )
  )
  .parameter(
    'bucketName',
    field.optional(
      field.string({
        description: '存储桶名称（可选，默认使用环境变量MINIO_BUCKET）',
      })
    )
  )
  .parameter(
    'directory',
    field.optional(
      field.string({
        description: '目录前缀（可选，默认为"files"）',
      })
    )
  )
  .parameter(
    'contentType',
    field.optional(
      field.string({
        description: 'MIME类型（可选，自动检测）',
      })
    )
  )
  .parameter(
    'expirySeconds',
    field.optional(
      field.number({
        description: '下载链接过期时间（秒），默认3600秒（1小时）',
        minimum: 60,
        maximum: 604800, // 7天
      })
    )
  )
  .build(async params => {
    return await minioUploadTool.uploadFile(params as any);
  });

/**
 * 上传多个文件到Minio存储（批量上传）
 */
const uploadMultipleToMinio = createTool()
  .name('upload_multiple_files_to_minio')
  .title('批量上传文件到Minio')
  .description('批量上传多个本地文件到Minio对象存储并生成下载链接')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文件管理')
  .tags(['minio', 'upload', 'batch', 'storage', 'file'])
  .parameter(
    'files',
    field.required(
      field.array(
        field.object(
          {
            filePath: field.required(field.string({ description: '文件路径' })),
            objectName: field.optional(field.string({ description: '对象名称' })),
            contentType: field.optional(field.string({ description: 'MIME类型' })),
          },
          { description: '文件信息' }
        ),
        { description: '要上传的文件列表' }
      )
    )
  )
  .parameter(
    'bucketName',
    field.optional(
      field.string({
        description: '存储桶名称（可选，默认使用环境变量）',
      })
    )
  )
  .parameter(
    'directory',
    field.optional(
      field.string({
        description: '目录前缀（可选，默认为"files"）',
      })
    )
  )
  .parameter(
    'expirySeconds',
    field.optional(
      field.number({
        description: '下载链接过期时间（秒），默认3600秒',
        minimum: 60,
        maximum: 604800,
      })
    )
  )
  .build(async params => {
    return await minioUploadTool.uploadMultipleFiles(params as any);
  });

/**
 * 生成已存在对象的预签名下载链接
 */
const generateDownloadLink = createTool()
  .name('generate_minio_download_link')
  .title('生成Minio下载链接')
  .description('为已存在于Minio存储中的对象生成预签名下载链接')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文件管理')
  .tags(['minio', 'download', 'link', 'presigned'])
  .parameter(
    'objectPath',
    field.required(
      field.string({
        description: '对象在存储中的完整路径',
      })
    )
  )
  .parameter(
    'bucketName',
    field.optional(
      field.string({
        description: '存储桶名称（可选，默认使用环境变量）',
      })
    )
  )
  .parameter(
    'expirySeconds',
    field.optional(
      field.number({
        description: '链接过期时间（秒），默认3600秒',
        minimum: 60,
        maximum: 604800,
      })
    )
  )
  .build(async params => {
    return await minioUploadTool.generateDownloadLink(params as any);
  });

/**
 * 检查Minio配置状态
 */
const checkMinioStatus = createTool()
  .name('check_minio_status')
  .title('检查Minio状态')
  .description('检查Minio连接状态和配置信息')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('系统管理')
  .tags(['minio', 'status', 'health', 'config'])
  .build(async params => {
    return await minioUploadTool.checkStatus(params as any);
  });

// 导出工具包
export const tools = [
  uploadToMinio,
  uploadMultipleToMinio,
  generateDownloadLink,
  checkMinioStatus,
];

export const meta = {
  name: 'minio',
  version: '1.0.0',
  description: 'Minio对象存储工具包',
  author: 'Test Case Writer Team',
};

// 默认导出
const toolPackage: ToolPackage = {
  tools,
  meta,
};

export default toolPackage;
